# -*- coding: utf-8 -*-
"""数据导出模块，负责将处理后的数据导出为Excel文件"""
import os

import pandas as pd


from src.config.exceptions import ExportError
from src.utils.excel_utils import ExcelUtils


class DataExporter:
    """负责数据导出功能的实现"""

    def __init__(self):
        """初始化数据导出器"""
        self.excel_utils = ExcelUtils()

    def export_to_excel(self, data, file_path, sheet_name="Sheet1"):
        """将数据导出到Excel文件

        Args:
            data: 要导出的数据（DataFrame）
            file_path: 导出文件的路径
            sheet_name: 工作表名称

        Returns:
            导出的文件路径

        Raises:
            ExportError: 导出失败时抛出
        """
        try:
            # 检查数据是否为空
            if data is None or data.empty:
                raise ExportError("没有数据可导出")

            # 检查文件路径是否有效
            if not file_path:
                raise ExportError("文件路径不能为空")

            # 确保文件目录存在
            file_dir = os.path.dirname(file_path)
            if file_dir and not os.path.exists(file_dir):
                os.makedirs(file_dir)

            # 导出数据到Excel
            self.excel_utils.export_to_excel(data, file_path, sheet_name)

            return file_path
        except Exception as e:
            if isinstance(e, ExportError):
                raise
            raise ExportError(f"导出Excel文件失败: {str(e)}") from e

    def export_classified_data(self, classified_data, file_path):
        """导出分类后的数据到Excel文件

        Args:
            classified_data: 分类后的数据（DataFrame）
            file_path: 导出文件的路径

        Returns:
            导出的文件路径

        Raises:
            ExportError: 导出失败时抛出
        """
        try:
            # 创建一个新的Excel工作簿
            writer = pd.ExcelWriter(file_path, engine="openpyxl")

            # 按分类导出数据到不同的工作表
            if "备注" in classified_data.columns:
                # 获取所有唯一的备注值
                categories = classified_data["备注"].unique()

                # 导出每个分类的数据到单独的工作表
                for category in categories:
                    category_data = classified_data[
                        classified_data["备注"] == category
                    ]
                    sheet_name = self._get_sheet_name_by_category(category)
                    category_data.to_excel(
                        writer, sheet_name=sheet_name, index=False
                    )

            # 保存工作簿
            writer.save()
            writer.close()

            return file_path
        except Exception as e:
            raise ExportError(f"导出分类数据失败: {str(e)}") from e

    def _get_sheet_name_by_category(self, category):
        """根据分类获取工作表名称

        Args:
            category: 数据分类

        Returns:
            工作表名称
        """
        # 这里简化实现，实际应该根据具体的分类映射工作表名称
        # 可以从constants.py中导入相应的映射
        return category[:31]  # Excel工作表名称长度限制为31个字符

    def export_with_styles(self, data, file_path, style_config=None):
        """导出带有样式的数据到Excel文件

        Args:
            data: 要导出的数据（DataFrame）
            file_path: 导出文件的路径
            style_config: 样式配置字典

        Returns:
            导出的文件路径

        Raises:
            ExportError: 导出失败时抛出
        """
        try:
            # 导出数据到临时文件
            temp_file = file_path + ".tmp"
            self.export_to_excel(data, temp_file)

            # 应用样式
            # 这里简化实现，实际应该调用ExcelUtils中的方法来应用样式
            # self.excel_utils.apply_styles(temp_file, file_path, style_config)

            # 重命名临时文件为最终文件
            if os.path.exists(file_path):
                os.remove(file_path)
            os.rename(temp_file, file_path)

            return file_path
        except Exception as e:
            # 清理临时文件
            if os.path.exists(temp_file):
                os.remove(temp_file)
            raise ExportError(f"导出带样式的数据失败: {str(e)}") from e
